import axios, { AxiosInstance } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import { Session } from '/@/utils/storage';
import qs from 'qs';
import { router } from '/@/router';
import { useUserInfo } from '/@/stores/userInfo';
import pinia from '/@/stores/index';

// 配置新建一个 axios 实例
const service: AxiosInstance = axios.create({
	baseURL: import.meta.env.VITE_API_URL,
	timeout: 50000,
	headers: { 'Content-Type': 'application/json' },
	paramsSerializer: {
		serialize(params) {
			return qs.stringify(params, { allowDots: true });
		},
	},
});

// 添加请求拦截器
service.interceptors.request.use(
	(config) => {
		// 在发送请求之前做些什么 token
		const token = Session.get('token');
		console.log(token);
		
		if (token) {
			// 根据后端要求的格式设置请求头
			// 获取实际的用户ID而不是硬编码
			const userInfoStore = useUserInfo(pinia);
			const userId = userInfoStore.userInfos.id || userInfoStore.userInfos.userId || '43';
			config.headers!['id'] = userId.toString();
			config.headers!['token'] = token;
		}
		return config;
	},
	(error) => {
		// 对请求错误做些什么
		return Promise.reject(error);
	}
);

// 添加响应拦截器
service.interceptors.response.use(
	(response) => {
		// 对响应数据做点什么
		const res = response.data;
		console.log(res);
		// 根据后端接口格式，code 为 1 表示成功
		if (res.code && res.code === 1) {
			return res;
		} else if (res.code && res.code !== 1) {
			// `token` 过期或者账号已在别处登录
			if (res.code === 2 || res.msg === "token验证失败") {
				Session.clear(); // 清除浏览器全部临时缓存
				const userInfoStore = useUserInfo(pinia);
				userInfoStore.clearUserInfos();
				ElMessageBox.alert('你已被登出，请重新登录', '提示', {})
					.then(() => {
						router.push('/login');
					})
					.catch(() => {
						router.push('/login');
					});
			} else {
				// 其他错误情况
				ElMessage.error(res.msg || '请求失败');
			}
			return Promise.reject(res.msg || '请求失败');
		} else {
			return res;
		}
	},
	(error) => {
		// 对响应错误做点什么
		if (error.message.indexOf('timeout') != -1) {
			ElMessage.error('网络超时');
		} else if (error.message == 'Network Error') {
			ElMessage.error('网络连接错误');
		} else if (error.response && (error.response.status === 401 || error.response.status === 4001)) {
			// 处理HTTP 401/4001状态码
			Session.clear();
			const userInfoStore = useUserInfo(pinia);
			userInfoStore.clearUserInfos();
			ElMessageBox.alert('登录已过期，请重新登录', '提示', {})
				.then(() => {
					router.push('/login');
				})
				.catch(() => {
					router.push('/login');
				});
		} else {
			if (error.response && error.response.data) {
				ElMessage.error(error.response.data.msg || error.response.statusText);
			} else {
				ElMessage.error('接口路径找不到');
			}
		}
		return Promise.reject(error);
	}
);

// 导出 axios 实例
export default service;